package br.com.virtual.replicar.service.impl;
  
import java.util.ArrayList;
import java.util.List;

import javax.ejb.Local;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.inject.Inject;

import br.com.virtual.base.enums.ActionFormEnum;
import br.com.virtual.cadastrar.model.Categoria;
import br.com.virtual.cadastrar.model.Endereco;
import br.com.virtual.cadastrar.model.Foto;
import br.com.virtual.cadastrar.model.Grupo;
import br.com.virtual.cadastrar.model.Pessoa;
import br.com.virtual.cadastrar.model.PessoaFisica;
import br.com.virtual.cadastrar.model.PessoaJuridica;
import br.com.virtual.cadastrar.model.Produto;
import br.com.virtual.cadastrar.model.Usuario;
import br.com.virtual.recomendar.model.Avaliacao;
import br.com.virtual.replicar.dao.SincronizarDAO;
import br.com.virtual.replicar.model.AvaliacaoSinc;
import br.com.virtual.replicar.model.CategoriaSinc;
import br.com.virtual.replicar.model.EnderecoSinc;
import br.com.virtual.replicar.model.FotoSinc;
import br.com.virtual.replicar.model.GrupoSinc;
import br.com.virtual.replicar.model.InteresseSinc;
import br.com.virtual.replicar.model.ItemVendaSinc;
import br.com.virtual.replicar.model.PagamentoSinc;
import br.com.virtual.replicar.model.PessoaFisicaSinc;
import br.com.virtual.replicar.model.PessoaJuridicaSinc;
import br.com.virtual.replicar.model.PessoaSinc;
import br.com.virtual.replicar.model.ProdutoSinc;
import br.com.virtual.replicar.model.Sincronizar;
import br.com.virtual.replicar.model.UsuarioSinc;
import br.com.virtual.replicar.model.VendaSinc;
import br.com.virtual.replicar.model.VirtualModelReplicacao;
import br.com.virtual.replicar.service.SincronizarService;
import br.com.virtual.vender.model.Interesse;
import br.com.virtual.vender.model.ItemVenda;
import br.com.virtual.vender.model.Pagamento;
import br.com.virtual.vender.model.Venda;

@Stateless
@Local(SincronizarService.class)
public class SincronizarServiceImpl implements SincronizarService{

	
	@Inject
	private SincronizarDAO dao;
	
	@Override
	@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
	public Sincronizar create(Sincronizar sincronizar) {

		return dao.create(sincronizar);
	}

	
	@Override
	@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
	public Sincronizar read(Long id) {

		return dao.read(id);
	}

	
	@Override
	@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
	public void update(Sincronizar sincronizar) {

		dao.update(sincronizar);
	}

	
	@Override
	@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
	public void delete(Sincronizar sincronizar) {
		
		dao.delete(sincronizar);
	}

	
	@Override
	@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
	public List<Sincronizar> getList() {

		return dao.getList();
	}

	@Override
	@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
	public Long count(){
		return dao.count();
	}


	@Override
	@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
	public VirtualModelReplicacao getObjetoSincronizar(
			Sincronizar itemSincronizar) {

		
			
		if (itemSincronizar.getClasseEntidade().equals(Categoria.class.toString())) {
		
			if( !itemSincronizar.getAcao().equals(ActionFormEnum.DELETE) )		
				return dao.getVirtualReplicationModel( new CategoriaSinc(itemSincronizar.getIdEntidade()) );
			else
				return new CategoriaSinc(itemSincronizar.getIdEntidade());

			
		} else if (itemSincronizar.getClasseEntidade().equals(Avaliacao.class.toString())){
			
			if( !itemSincronizar.getAcao().equals(ActionFormEnum.DELETE) )		
				return dao.getVirtualReplicationModel( new AvaliacaoSinc(itemSincronizar.getIdEntidade()) );
			else
				return new AvaliacaoSinc(itemSincronizar.getIdEntidade());

			
		} else if (itemSincronizar.getClasseEntidade().equals(Endereco.class.toString())){
			
			if( !itemSincronizar.getAcao().equals(ActionFormEnum.DELETE) )		
				return dao.getVirtualReplicationModel( new EnderecoSinc(itemSincronizar.getIdEntidade()) );
			else
				return new EnderecoSinc(itemSincronizar.getIdEntidade());
			

		} else if (itemSincronizar.getClasseEntidade().equals(Foto.class.toString())){

			if( !itemSincronizar.getAcao().equals(ActionFormEnum.DELETE) )		
				return dao.getVirtualReplicationModel( new FotoSinc(itemSincronizar.getIdEntidade()) );
			else
				return new FotoSinc(itemSincronizar.getIdEntidade());
			

		} else if (itemSincronizar.getClasseEntidade().equals(Grupo.class.toString())){
			
				
			if( !itemSincronizar.getAcao().equals(ActionFormEnum.DELETE) )		
				return dao.getVirtualReplicationModel( new GrupoSinc(itemSincronizar.getIdEntidade()) );
			
			else
				return new GrupoSinc(itemSincronizar.getIdEntidade());

			
		} else if (itemSincronizar.getClasseEntidade().equals(Interesse.class.toString())){
			
			if( !itemSincronizar.getAcao().equals(ActionFormEnum.DELETE) ){		
				
				try{
				InteresseSinc is = new InteresseSinc(itemSincronizar.getIdEntidade());
				is = dao.getVirtualReplicationModel( is );
				return is;
				}catch(Exception e){
					
					System.out.println("here");
					return null;
				}
			}else
				return new InteresseSinc(itemSincronizar.getIdEntidade());

		} else if (itemSincronizar.getClasseEntidade().equals(ItemVenda.class.toString())){
			
			if( !itemSincronizar.getAcao().equals(ActionFormEnum.DELETE) )		
				return dao.getVirtualReplicationModel( new ItemVendaSinc(itemSincronizar.getIdEntidade()) );
			else
				return new ItemVendaSinc(itemSincronizar.getIdEntidade());

		} 
		else if (itemSincronizar.getClasseEntidade().equals(Pagamento.class.toString())){
			
			if( !itemSincronizar.getAcao().equals(ActionFormEnum.DELETE) )		
				return dao.getVirtualReplicationModel( new PagamentoSinc(itemSincronizar.getIdEntidade()) );
			else
				return new PagamentoSinc(itemSincronizar.getIdEntidade());

		} 
		else if (itemSincronizar.getClasseEntidade().equals(Pessoa.class.toString())){
			
			if( !itemSincronizar.getAcao().equals(ActionFormEnum.DELETE) )		
				return dao.getVirtualReplicationModel( new PessoaSinc(itemSincronizar.getIdEntidade()) );
			else
				return new PessoaSinc(itemSincronizar.getIdEntidade());

		} else if (itemSincronizar.getClasseEntidade().equals(PessoaFisica.class.toString())){
			
			if( !itemSincronizar.getAcao().equals(ActionFormEnum.DELETE) )		
				return dao.getVirtualReplicationModel( new PessoaFisicaSinc(itemSincronizar.getIdEntidade()) );
			else
				return new PessoaFisicaSinc(itemSincronizar.getIdEntidade());

		} else if (itemSincronizar.getClasseEntidade().equals(PessoaJuridica.class.toString())){
			
			if( !itemSincronizar.getAcao().equals(ActionFormEnum.DELETE) )		
				return dao.getVirtualReplicationModel( new PessoaJuridicaSinc(itemSincronizar.getIdEntidade()) );
			else
				return new PessoaJuridicaSinc(itemSincronizar.getIdEntidade());

		} else if (itemSincronizar.getClasseEntidade().equals(Produto.class.toString())){
			
			if( !itemSincronizar.getAcao().equals(ActionFormEnum.DELETE) )		
				return dao.getVirtualReplicationModel( new ProdutoSinc(itemSincronizar.getIdEntidade()) );
			else
				return new ProdutoSinc(itemSincronizar.getIdEntidade());

		} else if (itemSincronizar.getClasseEntidade().equals(Usuario.class.toString())){
			
			if( !itemSincronizar.getAcao().equals(ActionFormEnum.DELETE) )		
				return dao.getVirtualReplicationModel( new UsuarioSinc(itemSincronizar.getIdEntidade()) );
			else
				return new UsuarioSinc(itemSincronizar.getIdEntidade());

		} else if (itemSincronizar.getClasseEntidade().equals(Venda.class.toString())){
			
			if( !itemSincronizar.getAcao().equals(ActionFormEnum.DELETE) ){		
				
				VendaSinc vs = dao.getVirtualReplicationModel( new VendaSinc(itemSincronizar.getIdEntidade()) );
				vs.setItens(new ArrayList<ItemVendaSinc>());
				return vs;
			}else
				return new VendaSinc(itemSincronizar.getIdEntidade());
		}

		System.out.println("SINCRONIZARSERVICEIMPL getObjetoSincronizar  FALTA ADICIONAR OBJETO A REPLICAR AQUIIIIIII");
		return null;

	}
}